import os

def dfs_traverse(directory):
    """
    深度优先搜索遍历指定目录，使用嵌套元组存储结果
    
    参数:
        directory: 要遍历的目录路径
        
    返回:
        元组，格式为(文件夹名, [子文件夹元组...], [文件名...])
        其中每个子文件夹元组结构与返回值一致
    """
    # 获取当前目录名称
    dir_name = os.path.basename(directory)
    
    # 初始化子文件夹列表和文件列表
    subfolders = []
    files = []
    
    try:
        # 获取目录下所有条目
        entries = os.listdir(directory)
    except PermissionError:
        print(f"没有权限访问目录: {directory}")
        return (dir_name, subfolders, files)
    except FileNotFoundError:
        print(f"目录不存在: {directory}")
        return (dir_name, subfolders, files)
    except Exception as e:
        print(f"访问目录出错 {directory}: {str(e)}")
        return (dir_name, subfolders, files)
    
    for entry in entries:
        entry_path = os.path.join(directory, entry)
        
        try:
            # 检查是否为文件夹
            if os.path.isdir(entry_path):
                # 递归遍历子文件夹，获取子文件夹元组
                subfolder_tuple = dfs_traverse(entry_path)
                subfolders.append(subfolder_tuple)
            # 检查是否为文件
            elif os.path.isfile(entry_path):
                # 存储文件名
                files.append(entry)
        except Exception as e:
            print(f"处理 {entry_path} 时出错: {str(e)}")
            continue
    
    # 返回当前目录的元组：(目录名, 子目录元组列表, 文件列表)
    return (dir_name, subfolders, files)

# 示例用法
if __name__ == "__main__":
    import json
    from collections import namedtuple

    target_dir = "."  # 当前目录
    result = dfs_traverse(target_dir)
    print(result)
    # 定义一个命名元组方便理解结构
    Folder = namedtuple('Folder', ['name', 'subfolders', 'files'])
    
    # 转换为命名元组并打印结构
    def print_tuple(tuple_data, indent=0):
        folder = Folder(*tuple_data)
        print("  " * indent + f"文件夹: {folder.name}")
        print("  " * indent + f"包含文件: {', '.join(folder.files) or '无'}")
        
        if folder.subfolders:
            print("  " * indent + "子文件夹:")
            for sub in folder.subfolders:
                print_tuple(sub, indent + 1)
    
    print_tuple(result)
